/**
 * js ES6语法汇总
 */

// 一,变量let,常量const,块作用域{}
{
    let count = 0 //声明变量
    count++
    console.log(count)

    const BASE_URL = 'http://localhost:8000'
    // BASE_URL = 'http://www.baidu.com' //错误:不能变更常量
}
// console.log(count) //错误: count未定义

// 二,模板字符串`${key}`
let STR1 = 'abc'
let str2 = `${STR1}def
...还能换行
`
console.log(str2)

// 三1,解构赋值-数组(列表)
let ary = [1, 2, 3]
// let v1 = arr[0]
// let v2 = arr[1]
// let v3 = arr[2]
let [v1, v2, v3] = [1, 2, 3]
console.log(v1, v2, v3)
// 三2,解构赋值-对象
const {username, age:userAge, ...otherInfo} = {
    username: '刘德华',
    age: 19,
    gender: 'male',
    class: '16'
    
}
console.log(username, userAge, otherInfo) //, ...otherInfo 必须写在最后,它将是一个包含剩余所有属性的对象

// 四,数组和对象的扩展
// 四1,扩展运算符 ...
let arr1 = [1,2,3]
let arr2 = [4,5,6]
let arr3 = [...arr1, ...arr2, 7, 8, 9]
console.log(arr3)
let obj1 = {
    a: 1
}
let obj2 = {
    b: 2
}
let obj3 = {c:3, ...obj1, ...obj2} //建议先写自身功能,再导入其他的对象
console.log(obj3)
// 四2,数组方法:Array.from(伪数组)将伪数组转换为数组
function fn() {
    // arguments.push(1) // 错误:arguments是实参,类型是伪数组,如果直接调用push,将会报错
    Array.from(arguments).push(5)
}
fn(1, 2, 3, 4)
// 四3,对象方法:Object.assign()对象分派
let objA = {
    
    age: '刘德华',
    age: 19
}
let objB = Object.assign({}, objA) //此时,objB将不再引用objA的内存地址,而是成为一个全新的对象
objB.age = '张学友'
console.log(objA, objB) //证实二者引用地址不同

//五,类class
class A { //定义A类
    constructor(name, age){ //构造函数,初始化对象时要求必须给属性name和age赋值
        this.name = name
        this.age = age
    }

    introduce () {
        console.log(`我的名字是${this.name},我的年龄是${this.age}`)
    }
}
let a1 = new A('刘德华', 19) //实例化A类
a1.introduce()
class B extends A { //定义B类
    constructor(name, age, gender) { //构造函数
        super(name, age) //super直接调用a1的的赋值逻辑
        this.gender = gender
    }

    sayHi () {
        console.log(`我是${this.name}，今年${this.age}，性别${this.gender}`)
    }
}
let b1 = new B('张学友', 18, '男')
b1.sayHi()

//六,箭头函数(匿名函数的简写方式)
// let getSum = function(a,b) { //定义一个匿名函数,返回两个参数的和
//     return a+b
// }
// 用箭头函数简写: let functionName = (参数,...) => return的值
let getSum = (a, b) => a+b
console.log(getSum(10,1))
// 如果参数数量可变?
let getSummary = (a, b, ...other) => console.log(a, b, other) //...other必须写在参数最后
getSummary(1,2,3,4,5,6,7,8,9) //会发现other是一个数组
// 如果不是一个简单的返回值? => {函数体}
let getResult = (arr) => {
    // 进行相应操作即可
    let sum = 0
    arr.forEach(item => sum += item)
    // 最后自己return
    return sum
}
console.log(getResult([1,2,3,4,5]))